//package com.dfs.parent.common.sharding;
//
//import com.google.common.collect.Range;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.shardingsphere.api.sharding.standard.RangeShardingAlgorithm;
//import org.apache.shardingsphere.api.sharding.standard.RangeShardingValue;
//
//import java.util.Collection;
//import java.util.LinkedHashSet;
//import java.util.Set;
//
///**
// * @Description 分表范围查询, 支持between and < > <= >= in 查询
// *  只支持单分片字段条件路由，不支持多分片字段
// *   @notice: <strong>分库算法设置与此类似,dosharding传入的collection就是所有库的集合<strong/>
// *
// * @Author dahong
// * @Date 2024/3/27 01:01
// */
//@Slf4j
//public class OrderRangeShardingAlgorithm implements RangeShardingAlgorithm<Long> {
//    /*google guava Range定义了连续跨度的范围边界，这个连续跨度是一个可以比较的类型(Comparable type)。比如1到100之间的整型数据。
//
//　　     在数学里面的范围是有边界和无边界之分的；同样，在Guava中也有这个说法。如果这个范围是有边界的，那么这个范围又可以
//       分为包括开集（不包括端点）和闭集（包括端点）；如果是无解的可以用+∞表示。如果枚举的话，一共有九种范围表示：
//
//       概念	       表示范围	        guava对应功能方法
//       (a..b)	{x | a < x < b}	    open(C, C)
//       [a..b]	{x | a <= x <= b} 	closed(C, C)
//       [a..b)	{x | a <= x < b}	closedOpen(C, C)
//       (a..b]	{x | a < x <= b}	openClosed(C, C)
//       (a..+∞)	{x | x > a}	        greaterThan(C)
//       [a..+∞)	{x | x >= a}	    atLeast(C)
//       (-∞..b)	{x | x < b}	        lessThan(C)
//       (-∞..b]	{x | x <= b}	    atMost(C)
//       (-∞..+∞)	all values	    all()*/
//    @Override
//    public Collection<String> doSharding(Collection<String> databaseNames, RangeShardingValue<Long> rangeShardingValue) {
//        Set<String> result = new LinkedHashSet<>();
//        if (Range.closed(1L, 9L).encloses(rangeShardingValue.getValueRange())) {
//            for (String each : databaseNames) {
//                if (each.endsWith("0")) {
//                    result.add(each);
//                }
//            }
//        } else if (Range.closed(10L, 19L).encloses(rangeShardingValue.getValueRange())) {
//            for (String each : databaseNames) {
//                if (each.endsWith("1")) {
//                    result.add(each);
//                }
//            }
//        } else if (Range.closed(20L, 100L).encloses(rangeShardingValue.getValueRange())) {
//            result.addAll(databaseNames);
//        } else {
//            throw new UnsupportedOperationException();
//        }
//        return result;
//    }
//}
